using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Text;

namespace Widgetsphere.Generator.Common.GeneratorFramework
{
  public abstract class BaseModelObject : IModelObject
  {
    #region Class Members

    protected string _key = Guid.NewGuid().ToString();
    protected IModelObject _root;
		protected bool _dirty = false;
		protected bool _cancelUIEvents = false;
		protected IModelObjectController _controller = null;

    #endregion

    #region Constructor

    public BaseModelObject(IModelObject root)
    {
      _root = root;
    }

    #endregion

    #region Events

    public event PropertyChangedEventHandler PropertyChanged;
    public event System.EventHandler DirtyChanged;

    protected void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
      this.Dirty = true;

			//Cancel UI events if necessary
			if (!this.CancelUIEvents)
			{
				if (this.PropertyChanged != null)
					this.PropertyChanged(sender, e);
			}
    }

    protected void OnDirtyChanged(object sender, System.EventArgs e)
    {      
      if (this.DirtyChanged != null)
        this.DirtyChanged(sender, e);
    }

    #endregion

    #region Property Implementations

		[Browsable(false)]
		public virtual IModelObjectController Controller
		{
			get { return _controller; }
			set { _controller = value; }
		}

    [Browsable(false)]
		public virtual IModelObject Root
    {
      get { return _root; }
    }

    [Browsable(false)]
		public virtual string Key
    {
      get { return _key; }
    }

    [Browsable(false)]
		public virtual bool Dirty
    {
      get { return _dirty; }
      set
      {
        //if (_dirty != value)
        //{
          _dirty = value;
          this.OnDirtyChanged(this, new System.EventArgs());
          if ((this.Dirty) && (this.Root != null) && (this != this.Root))
            this.Root.Dirty = true;
        //}
      }
    }

		[Browsable(false)]
		public virtual bool CancelUIEvents
		{
			get { return _cancelUIEvents; }
			set { _cancelUIEvents = value; }
		}

    #endregion

    #region IXMLable Members

    public abstract void XmlAppend(System.Xml.XmlNode node);
    public abstract void XmlLoad(System.Xml.XmlNode node);

    #endregion

  }
}
